package com.crm.service.orderManager;

import com.crm.model.entity.customerManager.CustomerOrderBackMoney;
import com.crm.model.entity.customerManager.CustomerOrderBackMoneyExamine;
import com.crm.model.entity.finishOrderProduct.FinishOrderProduct;
import com.crm.model.entity.orderManager.CustomerProductOrder;
import com.crm.model.entity.returnMoney.ReturnMoney;
import com.crm.model.qo.customerManager.OrderBackMoneyQO;
import com.crm.model.qo.orderManager.CustomerProductOrderQO;
import com.crm.model.qo.orderManager.ExportOrderProductQO;
import com.crm.model.qo.orderManager.FinanceProductOrderQO;
import com.crm.model.vo.customerManager.BalanceBackMoneyVO;
import com.crm.model.vo.customerManager.CustomerOrderBackMoneyVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.orderManager.*;
import com.crm.model.vo.returnMoney.FinanceProductOderInfoVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * @ Author ：pym
 * @ Date   ：2021/3/12 10:40
 */
public interface CustomerProductOrderDbService {
    /**
     * 订单管理-订单列表
     * @Author pym
     * @Date  2021/3/12 11:17
     * @param customerProductOrderQO -查询条件
     * @param dateUnit -日期类型(全部/本周/本月/本年度)
     * @param accountId -账号Id
     * @param companyId -所属分公司Id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.CustomerProductOrderVO>}}
     */
    List<CustomerProductOrderVO> selectAllCustomerProductOrderList(CustomerProductOrderQO customerProductOrderQO, Integer dateUnit, String order, String accountId, String companyId);

    /**
     * 订单详情基本信息
     * @Author pym
     * @Date  2021/3/17 11:10
     * @param productOrderId
     * @return {@link {com.crm.model.vo.orderManager.OrderDetailVO}}
     */
    OrderDetailVO selectOrderDetailVO(String productOrderId);

    /**
     * 产品订单表插入数据
     * @param customerProductOrder 订单Model
     * @return
     */
    Boolean insertProductOrder(CustomerProductOrder customerProductOrder);

    /**
     * 根据合同ID修改订单状态(合同列表--作废->未生效的合同可以作废)
     * @param contractId ---合同ID
     * @author yincuimei
     * @return
     */
    Boolean updateOrderStatusByContractId(String contractId);

    List<FinanceProductOrderVO> selectFinanceOrderVOList(FinanceProductOrderQO financeProductOrderQO, Integer dateUnit, String order, String companyId);

    /**
     * 财务-订单详情
     * @param productOrderId
     * @return
     */
    FinanceProductOderInfoVO getFinanceProductOderInfo(String productOrderId,Integer status,Integer type);

    /**
     * 根据合同id查询订单信息
     * @param contractId 合同id
     * @return
     */
    CustomerProductOrder selectProductOrderByContractId(String contractId);

    CustomerProductOrderVO getOrderInfoById(String orderId);

    /**
     * 通过订单编号查询订单信息
     * @param orderNumber
     * @return
     */
    CustomerProductOrderVO getOrderInfoByNumber(String orderNumber);

    /**
     * 回款、修改订单表
     * @param order
     * @return
     */
    void updateOrderComplete(CustomerProductOrderVO order);

    /**
     * 客户详情订单信息
     * @param order 分组类型
     * @param customerId 客户id
     * @param accountId 用户id
     * @return
     */
    List<CustomerProductOrder> orderList(String order, String customerId,String accountId);

    /**
     * 获取完成的订单的产品
     * @param orderId
     * @return
     */
    List<FinishOrderProduct> getFinishProductList(String orderId);

    /**
     * 更新产品订单表
     * @param customerProductOrder 订单model
     * @return
     */
    Boolean updateProductOrder(CustomerProductOrder customerProductOrder);

    /**
     * 根据订单id查询订单信息
     * @param orderId 订单id
     * @return
     */
    CustomerProductOrder selectCustomerProductOrderById(String orderId);

    /**
     * 申请开票页面订单详情
     * @param type
     * @param orderId
     * @return
     */
    ApplyInvoiceOrderInfoVO getApplyInvoiceOrderInfo(String type, String orderId);


    /***
     * @Description:会员非会员总额度统计
     * @Param:yearMark 查询月份(传12是今年，传24是去年)
     * @Author: luojie
     * @Date: 2021/4/27 22:26
     */
    BigDecimal selectAnnualAmountByOneMonth(String yeahMonth, String memberTag, String accountId);

    /**
     * 统计会员消费占比
     * @param year 年份
     * @return
     */
    List<Integer> getAnalyseVipBuyRatio(Integer year,String companyId);

    /**
     * 会员复购率
     * @param year 年份
     * @param companyId
     * @return
     */
    List<Integer> getAnalyseVipAgainBuyRatio(Integer year, String companyId);

    /**
     * 会员交易增长率
     * @param year
     * @param companyId
     * @return
     */
    List<BigDecimal> getAnalyseVipBuyRiseRatio(Integer year, String companyId);

    /***
     * @Description:查询公司本月金额共计
     * @Param: companyId 公司id
     * @Author: luojie
     * @Date: 2021/4/27 22:49
     */
    BigDecimal selectThisMonthCompanyPerformance(String companyId,String thisMonth);

    /***
     * @Description:查询个人本月金额统计
     * @Param: accountId 账号id
     * @Author: luojie
     * @Date: 2021/4/27 22:59
     */
    BigDecimal selectThisMonthPersonalPerformance(String accountId,String thisMonth);

    /***
     * @Description:查询业绩排名
     * @Author: luojie
     * @Date: 2021/4/29 9:23
     */
    List<PerformanceRankVO> selectPerformanceRank(String companyId);

    /**
     * 查询公司内个人本月业绩排名
     * @param companyId 公司id
     * @param accountId 账号id
     * @param thisMonth 本月
     * @Author: luojie
     */
    int personalThisMonthPerformanceRank(String companyId,String accountId,String thisMonth);

    /**
     * 根据账号和是否生效状态查询合同合同
     * @param orderStatus 合同状态
     * @param dateUnit contractStatus:1未生效；3:已结束（生效）；4:已作废
     * @param accountId 账号id
     * @Author: luojie
     * @return
     */
    BigDecimal selectContractAmount(String orderStatus,Integer dateUnit,String accountId);

    /***
     * @Description:查询合同数量
     * @param orderStatus 1:等待回款;2:已完成;3:作废;4:部分回款
     * @param dateUnit contractStatus:1未生效；3:已结束（生效）；4:已作废
     * @param accountId 账号id
     * @Author: luojie
     * @Date: 2021/4/29 15:56
     */
    long selectContractCount(String orderStatus,Integer dateUnit,String accountId);

    /***
     * @Description:查询合同退款数
     * @Param: dateUnit  ---全部、本周、本月查询条件
     * @Param: accountId 账号id
     * @Author: luojie
     * @Date: 2021/5/6 10:24
     */
    long selectContractRefundCount(Integer dateUnit,String accountId);


    /**
     * @Description: 通过订单编号获取数据
     * @Param: [orderNum]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByOrderNum(String orderNum);

    /**
     * 更新订单表全部字段
     * @param order
     */
    void updateByPrimaryKey(CustomerProductOrder order);

    /***
     * @Description:根据订单id部分更新订单表字段
     * @Param: order 订单对象
     * @Author: luojie
     * @Date: 2021/9/7 11:21
     */
    Boolean updateByPrimaryKeySelective(CustomerProductOrder order);

    /**
     * 根据订单编号判断订单是否重复
     * @Author pym
     * @Date  2021/6/1 15:36
     * @param orderNumber 订单编号
     * @return {@link {com.crm.model.entity.orderManager.CustomerProductOrder}}
     */
    CustomerProductOrder isCustomerProductOrderRepeat(String orderNumber);

    /**
     * 根据订单编号查询
     * @param orderNumber
     * @return
     */
    CustomerProductOrderVO selectOrderByNumber(String orderNumber);

    /**
     * 根据月份查询公司的交易额
     * @param companyId
     * @param thisMonth
     * @return
     */
    BigDecimal selectThisMonthBigByCompanyId(String companyId, String thisMonth);

    /**
     * 查询会员总数
     * @param companyId
     */
    Integer selectCustomerCount(String companyId);

    /**
     * 当月客户消费额度
     * @param month
     * @param companyId
     * @return
     */
    BigDecimal getThisMonthCustomerConsumeCount(String month, String companyId);

    /**
     * 当月会员客户消费额度
     * @param month
     * @param companyId
     * @return
     */
    BigDecimal getThisMonthVipCustomerConsumeCount(String month, String companyId);

    /**
     * 当月续费会员数量
     * @param month
     * @param companyId
     * @return
     */
    Integer selectThisMonthRenewVip(String month, String companyId);

    /**
     * 新增退款信息
     * @param customerOrderBackMoney 退款类
     * @return
     */
    Boolean addCustomerOrderBackMoney(CustomerOrderBackMoney customerOrderBackMoney);

    /**
     * 管理端-退款列表
     * @Author bj
     * @Date  2021/7/27 9:27
     */
    List<CustomerOrderBackMoneyVO> customerOrderBackMoneyList(OrderBackMoneyQO orderBackMoneyQO);

    /**
     * 普通用户-退款列表
     * @Author bj
     * @Date  2021/7/27 9:27
     */
    List<CustomerOrderBackMoneyVO> userCustomerOrderBackMoneyList(OrderBackMoneyQO orderBackMoneyQO);

    /**
     * 退款产品表-通过主键id查询
     * @param orderBackMoneyId 退款id
     * @return
     */
    CustomerOrderBackMoney getCustomerOrderMoneyDetail(String orderBackMoneyId);

    /**
     * 修改退款记录
     * @param customerOrderBackMoney 退款产品记录
     * @return
     */
    Boolean updateCustomerOrderBackMoney(CustomerOrderBackMoney customerOrderBackMoney);

    /**
     * 通过产品明细id查询退款表查询是否存在,防止重复提交退款
     * @param productOrderDetailId 产品明细id
     * @return
     */
    CustomerOrderBackMoney selectCustomerOrderBackMoneyByDetailId(String productOrderDetailId,Integer backStatus);

    /**
     * 订单详情-退款信息
     * @Author bj
     * @Date  2021/7/27 9:27
     */
    List<CustomerOrderBackMoneyVO> orderBackMoneyList(String productOrderId);

    /**
     * 查询兑换码发送状态的订单
     * @param productOrderId 订单id
     * @param exchangeCodeSendingStatus
     * @return
     */
    CustomerProductOrder selectProductOrderAndSendStatus(String productOrderId, int exchangeCodeSendingStatus);

    /**
     * 通过订单id查询订单信息
     * @param productOrderId 订单id
     */
    CustomerProductOrder selectProductOrderById(String productOrderId);

    /**
     * 查询需要补发产品的订单
     * @return
     */
    List<String> selectAnewSendFinishOrderId();

    /**
     * 查询没有计算业绩金额的产品
     * @return
     */
    List<FinishOrderProduct> getFinishProductRoyaltyIsNullList();

    /**
     * 通过产品号和退款状态查询退款信息
     * @param finishOrderProductNum 产品号
     * @param bs 1查询已完成和审核中的  2查询审核中的
     * @return
     */
    List<CustomerOrderBackMoney> selectCustomerOrderBackMoneyByCph(String finishOrderProductNum,Integer bs);

    /**
     * 通过订单id和退款状态查询退款信息
     * @param productOrderId 订单id
     * @param backStatus 退款状态 审核中
     * @return
     */
    CustomerOrderBackMoney selectCustomerOrderBackMoneyByOrderId(String productOrderId, int backStatus);

    /**
     * 查询订单已完成的附加费用
     * @param productName 产品名称
     * @param orderId 订单id
     * @return
     */
    CustomerOrderBackMoney selectBackMoneyFjfy(String productName, String orderId);

    /**
     * 获取产品名称表头
     * @Author pym
     * @Date  2021/8/13 10:37
     * @param type 类型 memberNew：会员新建订单；membershipRenewal：会员续费订单；course：课程订单；
     * @param exportOrderProductQO 筛选条件
     * @param companyId 公司id
     * @return {@link {java.util.List<java.lang.String>}}
     */
    List<String> getProductNameList(String type, ExportOrderProductQO exportOrderProductQO, String companyId);

    /**
     * 获取产品名称和价格
     * @Author pym
     * @Date  2021/8/13 10:38
     * @param type 类型 memberNew：会员新建订单；membershipRenewal：会员续费订单；course：课程订单；
     * @param exportOrderProductQO 筛选条件
     * @param companyId 公司id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.OrderProductPriceVO>}}
     */
    List<OrderProductPriceVO> getProductNameAndPriceList(String type, ExportOrderProductQO exportOrderProductQO, String companyId);

    /**
     * 获取退款产品名称表头
     * @Author pym
     * @Date  2021/8/13 10:38
     * @param exportOrderProductQO 筛选条件
     * @param companyId 公司id
     * @return {@link {java.util.List<java.lang.String>}}
     */
    List<String> getRefundProductNameList(ExportOrderProductQO exportOrderProductQO, String companyId);

    /**
     * 获取退款产品名称和价格
     * @Author pym
     * @Date  2021/8/13 10:39
     * @param exportOrderProductQO 筛选条件
     ** @param companyId 公司id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.OrderProductPriceVO>}}
     */
    List<OrderProductPriceVO> getRefundProductNameAndPriceList(ExportOrderProductQO exportOrderProductQO, String companyId);

    /**
     * 财务首页订单数量统计
     * @param companyId
     * @return
     */
    FinanceIndexOrderInfoVO financeIndexOrderInfo(String companyId);

    /**
     * 查询各订单类型的回款金额
     * @param companyId
     * @param dateType
     * @return
     */
    List<BigDecimal> selectOrderTypeReturnMoney(String companyId, Integer dateType,Integer type);

    /**
     * 查询退款审核表
     * @param orderBackMoneyId 退款id
     * @return
     */
    CustomerOrderBackMoneyExamine selectOrderBackMoneyExamine(String orderBackMoneyId);

    /**
     * 新增退款审核表
     * @param examine 退款审核
     * @return
     */
    Boolean addCustomerOrderBackMoneyExamine(CustomerOrderBackMoneyExamine examine);

    /**
     * 修改退款审核表
     * @param examine 退款审核
     */
    Boolean updateCustomerOrderBackMoneyExamine(CustomerOrderBackMoneyExamine examine);

    /**
     * 总部财务退款列表
     * @param orderBackMoneyQO 退款信息
     * @return
     */
    List<CustomerOrderBackMoneyVO> superCustomerOrderBackMoneyList(OrderBackMoneyQO orderBackMoneyQO);

    /**
     * 通过退款id查询
     * @param orderBackMoneyId 退款id
     * @return
     */
    CustomerOrderBackMoney selectCustomerOrderBackMoneyById(String orderBackMoneyId);

    List<CustomerProductOrderVO> selectCustomerAllOrder(String orderStatus);

    /**
     * 退款详情-订单详情
     * @param orderBackMoneyId 退款id
     * @return
     */
    OrderDetailVO selectBackOrderDetail(String orderBackMoneyId);

    /**
     * 余额退款详情
     * @param orderBackMoneyId 退款id
     * @return
     */
    BalanceBackMoneyVO selectBalanceBackMoneyDetail(String orderBackMoneyId);

    /**
     * 补全之前退款的回款记录表
     */
    List<CustomerOrderBackMoney> repairReturnMoney();

    /**
     * 批量补充订单表客户信息(临时用补充正式库数据:customer_id;customer_name为空的)
     * @param customerProductOrderList
     * @author yincuimei
     * @Date(2021-9-26)
     * @return
     */
    Boolean batchUpdateCustomerProductOrderByIds(List<CustomerProductOrder> customerProductOrderList);

    /**
     * 通过订单id和产品号查询退款金额累加
     * @param productOrderId 订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    BigDecimal sumBackMoney(String productOrderId, String finishOrderProductNum);

    /**
     * 根据订单id修改订单状态
     * @Param customerProductOrder
     * @Author xielinqi
     * @Date 3:17 下午 2021/11/8
     */
    Boolean updateOrderSelective(CustomerProductOrder customerProductOrder);


    /**
     * @author  yuanyunfeng
     * @Description 预回款时修改订单
     * @date  2021/12/9 10:04
     * @Param [customerProductOrder]
     * @return boolean
     **/
    boolean updateOrderCustom(CustomerProductOrder customerProductOrder);

    /**
     * 退款未审核
     * @Author renshaorong
     * @Date 2021/12/17
     * @return
     */
    Integer getcustomerProductOrderNum();

    /**
     * 发放状态为已发放的
     * @param productOrderId 订单id
     * @param royaltyStatus 提成发放状态 0 未发放 1已发放
     * @return
     */
    ReturnMoney selectReturnByRoyaltyStatus(String productOrderId, int royaltyStatus);
}
